package util

import (
	"math/rand"
	"strconv"
	"time"
)

const (
	KC_RAND_KIND_NUM   = 0 // 纯数字
	KC_RAND_KIND_LOWER = 1 // 小写字母
	KC_RAND_KIND_UPPER = 2 // 大写字母
	KC_RAND_KIND_ALL   = 3 // 数字、大小写字母
)

var (
	nowNum  = 0
	chanInt = make(chan int, 1)
)

//保证同一时间戳的最后一位不相同
func getNumber() int {
	chanInt <- 1
	if nowNum == 9 {
		nowNum = 0
	} else {
		nowNum++
	}
	<-chanInt
	return nowNum
}

// 随机字符串   参数：长度，字符串种类
func Krand(size int, kind int) string { //种类，二维数组，切片
	ikind, kinds, result := kind, [][]int{[]int{10, 48}, []int{26, 97}, []int{26, 65}}, make([]byte, size)
	is_all := kind > 2 || kind < 0
	rand.Seed(time.Now().UnixNano()) //纳秒   给rand一个变值，防止多次调用产生重复的值，如加入时间戳作为变值
	for i := 0; i < size; i++ {
		if is_all { // random ikind
			ikind = rand.Intn(3) //随机生成3以内的数 ，用以随机数字，大小写字母
		}
		scope, base := kinds[ikind][0], kinds[ikind][1] //第几组有几个字符，第几组起始ascii值
		result[i] = uint8(base + rand.Intn(scope))      //八进制
	}

	return string(result) + strconv.Itoa(getNumber()) //字符输出
}
